Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

книги хакеры / журнал хакер / специальные выпуски / Специальный выпуск 64_Optimized

.pdf
Скачиваний:
15
Добавлен:
20.04.2024
Размер:
6.34 Mб
Скачать
Схема состояний и переходов

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

to BUY

 

 

 

 

 

 

 

 

 

 

 

w| 39

 

 

 

 

m

w Click

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Õ Î Ä Ü Á À

ó â è ä å ë â ð à ã à ?

 

ï ð è ø å ë â

ò î ÷ ê ó ?

 

 

ï î â î ð î ò î ê î í ÷ å í ?

 

 

 

 

 

 

 

 

 

 

 

 

 

?

 

 

 

 

 

 

 

 

 

 

 

 

à

 

 

 

 

 

 

 

 

 

 

ã

 

 

 

 

 

 

 

 

 

à

 

 

 

 

 

 

 

 

ð

 

 

 

 

 

 

 

 

ë

â

 

 

 

 

 

?

 

 

 

 

å

 

 

 

 

 

 

 

 

 

 

ä

 

 

 

 

 

 

 

ç

 

è

 

 

 

 

 

 

å

 

â

 

 

 

 

 

÷

 

 

 

ó

 

 

 

 

ñ

 

 

 

 

 

 

 

 

 

ã

è

 

 

 

 

 

 

 

 

 

 

à

 

 

 

 

 

 

 

 

 

 

ð

 

 

 

 

 

 

 

 

 

 

â

 

 

 

 

 

 

 

 

 

 

Ï Î Â Î Ð Î Ò

â ð à ã è ñ ÷ å ç ?

ДЛЯ БОЛЬШЕЙ НАГЛЯДНОСТИ Я НАПИСАЛ НЕБОЛЬШУЮ ПРОГРАММУ, КОТОРАЯ РЕАЛИЗУЕТ ПРИМЕР С ПАТРУЛИРУЮЩИМ СОЛДАТОМ. ТЫ НАЙДЕШЬ ЕЕ НА ДИСКЕ. ЗДЕСЬ ФИОЛЕТОВОЙ ТОЧКОЙ ОБОЗНАЧЕН ИГРОК (УПРАВЛЕНИЕ: W, A, S, D). КРАСНЫЙ ЦВЕТ — КОНТРОЛЬНЫЕ ТОЧКИ И СОЕДИНЯЮЩИЕ ИХ ОТРЕЗКИ, ЗЕЛЕНЫЙ — СОЛДАТЫ И ИХ ПОЛЕ ЗРЕНИЯ.

 

 

â ð à ã î ò î ø å ë ?

 

 

 

ï î ä î ø å ë ñ ë è ø ê î ì á ë è ç ê î ?

 

 

Ï Ð Å Ñ Ë Å Ä Î Â À Í È Å

Á Î É

куда им идти, что делать в любой ситуации, знают место расположения

игрока и то, из какого оружия его легче будет подстрелить? Наверное, интереснее противники, которые иногда могут ошибаться, делать что-то не так, в общем, вести себя как обычные люди. Именно такого мы ждем от искусственного соперника, который призван заменить нам живого человека. «Агентом» будем называть носителя ИИ, то есть некую игровую сущность, которая принимает все свои решения с помощью ИИ.

Системы игрового ИИ можно условно разделить на два типа. Первый — это локальный, то есть ИИ отдельной единицы: солдат, танк, пробегающий мимо заяц или автоматическая дверь на уровне. Такие системы состоят из основных четырех элементов: система ввода информации (сенсор); память; модуль (ядро) принятия решений; система вывода (реагирования) системы. Первый элемент отвечает за то, чтобы агент воспринял все факторы окружающего мира, относящиеся к делу: положение противника, наличие препятствий, посторонние звуки и т.д. Принимая во внимание внешние факторы (ввод системы) и происходившее ранее (память), агент решает, что ему делать в следующий момент времени. Например, солдат, патрулирующий здание, должен уметь перемещаться по коридорам этого здания, видеть и (встреча- ется нечасто) слышать. Он также должен правильно оценивать обстановку и принимать решение

об отступлении/атаке/вызове подкрепления (если успеет, конечно ;)), когда встречается с врагом.

Второй тип систем ИИ отвечает за глобальные действия/события в игре. Например, в стратегических играх он управляет всей армией врага, определяет баланс сил на основе некоторых показателей (обычно: количество ресурсов, юнитов, зданий и т.д.), затем на основе этой и другой информации вырабатывает свою стратегию ведения войны. Притом каждый юнит имеет свой локальный ИИ, который помогает ему выполнять приказы глобального (перемещаться по локациям, обходя препятствия; распознавать вражеские юниты и т.д.). (В общем, как говорится, куда пехотинцев ни пошли, обязательно зайдут на поле с тибериумом и сгорят. Куда харвестер ни пошлешь, обязательно нарвется на огнеметные танки :( — прим. Лозовского.)

Другой пример. Игровой уровень сам по себе может обладать неким подобием ИИ: если игрок уничтожит N врагов, поглумится над тремя трупами и дважды подпрыгнет на левой ноге, то откроется проход на следующий уровень.

Теперь рассмотрим некоторые самые популярные технологии создания игрового ИИ.

автоматы, которые не стреляют

Первая технология, которая несмотря на свою простоту оказывается очень мощной и применяется во многих играх, — это конечные автоматы (finite state machine). Для определения такой системы нужно задать два ключевых элемента: множество

состояний и множество правил перехода системы из одного состояния в другое. Состояния имеют вид наподобие: иду, стою, стреляю, бездельничаю и т.д. Правила перехода: если ИДУ и вижу врага, тогда начинаю СТРЕЛЯТЬ; если ИДУ и устал, тогда нужно немного поСТОЯТЬ, отдохнуть.

Рассмотрим небольшой пример. Пусть нам нужно придумать ИИ для солдата, который держит дубину и патрулирует местность. Для простоты будем считать, что на местности нет никаких препятствий, а солдат ходит по четко определенному маршруту (ключевым точкам). Итак, какие действия он может выполнять? Первое, конечно — ходить по прямой от одной контрольной точки (waypoint) к другой. Введем еще состояние поворота от одной точки по направлению к следующей. Плюс, конеч- но же, каждый уважающий себя солдат должен уметь преследовать жертву и молотить ее дубиной.

Теперь нужно разобраться с правилами изменения состояний. Ходьба: если увидел врага — переход в состояние преследования; если пришел в нужную точку — начать поворот к следующей. Поворот: увидел врага — преследовать; если повернулся на достаточный угол — начать ходьбу. Преследование: врага не видно — разворот к нужной точке (возврат к патрулированию); подошел достаточно близко к противнику — начать бой. Бой: враг

мнение

редактора

À í ä ð å é Ê à ð î ë è ê / A n d r u s h a — â û ï ó ñ ê à þ ù è é ð å ä à ê ò î ð

СОВЕРШЕННО ОЧЕВИДНО, ЧТО СЛИШКОМ СЛОЖНЫЕ ИГРЫ НЕ ИНТЕРЕСНЫ ГЕЙМЕРАМ. ЕСЛИ НА ПРОХОЖДЕНИЕ ИГРЫ ТРАТИТСЯ НЕОПРАВДАННО МНОГО ВРЕМЕНИ, ТО ВЫХОДА ДВА: УЗНАТЬ В СЕТИ, КАК ПРОЙТИ ЗАТЫК В ИГРЕ, ЛИБО БАНАЛЬНО ЗАБРОСИТЬ ВСЮ ИГРУ.

НО ПАРАДОКС СОСТОИТ В ТОМ,

ЧТО СЛИШКОМ ЛЕГКИЕ ИГРЫ ТОЖЕ МАЛОИНТЕРЕСНЫ. ТАК ЧТО ОСНОВНАЯ ЗАДАЧА — СДЕЛАТЬ НЕ СВЕРХУМНЫЙ AI, КАК ОШИБОЧНО ПОЛАГАЮТ МНОГИЕ, А ОПТИМАЛЬНЫЙ AI, ОРИЕНТИРУЯСЬ НА НЕКИЙ СРЕДНИЙ УРОВЕНЬ СЛОЖНОСТИ, ПРИЕМЛЕМЫЙ ДЛЯ БОЛЬШИНСТВА ГЕЙМЕРОВ.

В ИТОГЕ БОЛЬШИНСТВО ПОПУЛЯРНЫХ ИГР — ЭТО НЕКИЙ ИДЕАЛЬНЫЙ, ЕСЛИ ЕГО ТАК МОЖНО НАЗВАТЬ, AI, НО С ЯВНЫМИ БРЕШАМИ, КОТОРЫЕ ЗАЛОЖЕНЫ В НЕГО ИЗНАЧАЛЬНО. И ВСЯ ИГРА СВОДИТСЯ К ПОИСКУ И ОСОЗНАНИЮ ЭТИХ БРЕШЕЙ, ЧТОБЫ ИСПОЛЬЗОВАТЬ ИХ И ПОБЕДИТЬ ПРОТИВНИКА.

Системы правил в действии
добавим перцу

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

w

 

 

to

40 |

ТЕОРИЯ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

m

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

отошел дальше — преследовать; враг исчез (умер, сбежал) — поворот. Вот и все. Когда уже определены все состояния и переходы, закодить такую систему не составит большого труда.

Теперь немного о преимуществах и недостатках. Из преимуществ можно назвать относительную простоту в понимании, написании и отладке небольших систем, а также высокую производительность в работе. Недостатки: при большом количе- стве состояний и переходов реализация превращается в настоящий кошмар; такие системы трудно расширять — логика состояний и переходов жестко зашита в коде системы.

Конечные автоматы являются, пожалуй, одной из самых старых (и проверенных временем) техник создания ИИ, особенно в FPS. Наши любимые Doom, Quake и Wolfenstein, — все имели ИИ, построенный на основе конечных автоматов.

Сейчас посмотрим, как можно усовершенствовать конечные автоматы, чтобы системы на их основе выглядели еще лучше. Для начала замечу, что конечные автоматы бывают полностью детерминированными и недетерминированными. Различие состоит в том, что в недетерминированных переходы между состояниями являются не такими жесткими и имеют элемент случайности, непредсказуемости. Если в примере выше «нау- чить» солдата с 10% вероятностью не замечать врага, а в случае исчезновения врага в 50% случа- ев возвращаться к патрулированию и еще в 50% — начинать поиски сбежавшей жертвы, то такая система уже становится недетерминированной.

Создавать конечный автомат с большим количеством состояний и правил перехода — задача не из легких. Иногда бывает проще разделить систему ИИ на несколько параллельно действующих и (почти) не связанных конечных автоматов, каждый из которых имеет свои состояния. Например, один автомат отвечает за патрулирование/преследование/атаку, а второй — за систему ведения огня: стрелять, не стрелять, перезарядить и т.д.

Еще более удивительных результатов можно добиться при синхронизации конечных автоматов, работающих параллельно. Допустим, в нашей игре будут присутствовать отряды из трех солдат, которые охраняют некоторые локации. Конечно, каждый солдат может реализовывать свою логику ведения боя, но представь, насколько интереснее они смотрятся, если действуют слаженно. Например, один из солдат, заметив противника, сообщает об этом по рации (записывает это в общую память отряда) и принимает бой. Получив из общей памяти информацию о происходящем, другой солдат прикрывает товарища издалека («сообщая» об этом в ту же общую память). Наконец, третий боец начинает закидывать врага гранатами. Ну что, ничего не напоминает? (Даю наводку: Гордон Фримэн, монтировка, бригады солдат из пер-

âîé Half-Life...) Òî-òî æå!

жизнь по правилам Есть ситуации, в которых довольно проблемно выразить поведение игрового агента в терминах конечных автоматов. Например, когда из каждого состояния агент может переходить во все другие состояния или когда агент может пребывать в двух состояниях одновременно («идет» и «стреляет»). В таких случаях можно применить другую технологию — систему правил (rule system). Все поведение агента описывается набором простых правил вида: условие->дей- ствие. Сначала выбираем первое правило. Если условие в нем истинно, выполняем указанное действие и выходим (прекращаем проверку последующих условий). В противном случае переходим к следующему правилу, если таковые имеются. Как всегда, пример. Попробуем описать с помощью системы правил поведение юнита из одной RTS:

1 ВРАГ БЛИЗКО-> ДАТЬ ЕМУ ПО МОРДЕ

2 РАССТОЯНИЕ К ВРАГУ> ДВУХ МЕТРОВ && МЫ СИЛЬНЕЕ-> ДОГНАТЬ

3 РАССТОЯНИЕ К ВРАГУ> ДВУХ МЕТРОВ (ОН СИЛЬНЕЕ)-> ОЙ, ПОРА БЕЖАТЬ!

4 НАШИХ БЬЮТ-> ПОЙТИ НА ПОМОЩЬ

5 СТОЯТЬ И ЛЮБОВАТЬСЯ ПЕЙЗАЖАМИ

Замечу, что в подобных системах порядок указания правил имеет большое значение. Например, если поменять местами правила ¹2 и 3, юнит нач- нет убегать и от сильных, и от слабых врагов. (Такое поведение системы объясняется тем, что усло-

вие в правиле ¹3 включает в себя условие из правила ¹2.) Также замечу, что пятое правило вообще не имеет условия. Оно задает действие по умолчанию и равноценно правилу: true-> стоять и любоваться пейзажами.

На практике системы правил реализуются двумя способами. Первый — дерево принятия решений (decision tree), которое выглядит приблизительно так:

if ( условие1 )

действие1;

else

if ( условие2 )

действие2;

else

// и так далее...

Другой способ реализации системы правил опирается на скриптовые языки и является более гибким, так как в этом случае вся логика работы ИИ отделена от основного кода движка. Скриптовые системы правил применяются шире всего в стратегических играх, например Age of Empires.

Две следующие технологии более современные и берут свое начало из биологии — совокупности наук о живой природе. И правда, где еще можно узнать столько о существах, которых мы так старательно пытаемся смоделировать?

по стопам дедушки дарвина Приме-

нять генетические алгоритмы в играх начали сравнительно недавно. Они хорошо подходят в ситуациях, в которых нужно создать разнообразие су-

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

to BUY

 

 

 

 

 

 

 

 

 

 

 

w| 41

 

 

 

 

m

w Click

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

а что дальше?

ИТАК, ЧЕГО ЖЕ СЛЕДУЕТ ОЖИДАТЬ ОТ ИСКУССТВЕННЫХ ПРОТИВНИКОВ УЖЕ ЗАВТРА? ПРОИЗВОДИТЕЛЬНОСТЬ КОМПЬЮТЕРНЫХ СИСТЕМ РАСТЕТ СТРЕМИТЕЛЬНО, БЮДЖЕТЫ НА ПРОИЗВОДСТВО ИГР УВЕЛИЧИВАЮТСЯ ПОСТОЯННО, ЧТО ПРИВЕДЕТ В ПЕРВУЮ ОЧЕРЕДЬ К ПРИМЕНЕНИЮ БОЛЕЕ СЛОЖНЫХ ТЕХНОЛОГИЙ И АЛГОРИТМОВ, КОТОРЫМ ТРЕБУЮТСЯ БОЛЬШИЕ ВЫЧИСЛИТЕЛЬНЫЕ МОЩНОСТИ. УЖЕ СЕГОДНЯ НАЛИЧИЕ «ЧЕСТНОЙ ФИЗИКИ» СИЛЬНО УСЛОЖНЯЕТ ЖИЗНЬ СОЗДАТЕЛЮ ИГРОВОГО ИИ. ТАКЖЕ В ПОСЛЕДНИЕ ГОДЫ НАМЕЧАЕТСЯ ТЕНДЕНЦИЯ К РАЗВИТИЮ ТАКИХ НАПРАВЛЕНИЙ, КАК САМООБУЧЕНИЕ, УМЕНИЕ ВЗАИМОДЕЙСТВОВАТЬ С ИНТЕРАКТИВНЫМ ОКРУЖАЮЩИМ МИРОМ И НАЛАЖИВАНИЕ ЧЕТКОГО ВЗАИМОДЕЙСТВИЯ МЕЖДУ АГЕНТАМИ. ВСЕ ЭТО СЛУЖИТ ТОМУ, ЧТОБЫ ИГРЫ СТАЛИ ИНТЕРЕСНЕЕ И УВЛЕКАТЕЛЬНЕЕ.

 

 

 

ществ, несколько схо-

ровать не только биологические свойства, но и, на-

между собой. Процесс моделирования состоит из

 

Отряд из Half-Life

 

жих по внешнему виду

пример, стиль одежды, черты характера, прическу

двух основных этапов: обучение и собственно ис-

 

 

 

и/или поведению. При-

и т.д. (см. таблицу).

 

 

пользование. Два самых распространенных спо-

мером тому могут служить пешеходы в гоночных

Дальше генерируем первое поколение из N

соба обучения: 1) на вход системы подают сигна-

симуляторах или население некого виртуального

представителей данного вида выбором случайных

лы и результаты, которые нужно получать при та-

города/мира (как в GTA или The Sims).

значений из множества возможных (для каждого

ких входах; 2) на вход подаются сигналы опреде-

 

Из школьного курса биологии нам всем из-

гена). Следующая процедура называется тестом

ленного вида, которые система должна самостоя-

вестно, что в каждом из живых существ зашит не-

на пригодность (fitness testing), она же является од-

тельно структурировать и научиться отличать от

кий генетический код (ДНК помнишь?). Причем су-

ной из самых сложных. Сгенерированных индиви-

других (самообучение). На математическом уров-

щества в пределах одного вида имеют схожий по

дов помещаем в реальный игровой мир и выбира-

не обучение происходит путем подбора системой

структуре код, разный по своим составляющим

ем наиболее «способных». К примеру, для бойцов

нужных весовых коэффициентов (weights) в урав-

единицам — генам. Каждый ген кодирует некое

можно устраивать виртуальные поединки, чтобы

нениях. После некоторого времени обучения ней-

свойство живого организма, например цвет глаз,

решить, кто лучше. Потом генерируем второе по-

ронная сеть уже готова к использованию, а также

тип волос. Генетический код каждого индивида яв-

коление, создавав N индивидов как линейной ком-

последующему обучению.

ляется некой комбинацией генов его родителей

бинации ДНК отобранных. Также можно добавить

Революционность нейронных сетей приме-

плюс небольшой

процент мутаций (вообще-то

небольшую степень мутаций. Дальше — снова

нительно к игровому ИИ состоит в том, что теперь

в биологии имеются более строгие правила насле-

тест на пригодность и т.д. В конечном счете полу-

виртуальные соперники получают возможность

дования, но нам это не так важно). Основываясь

чается, что чем больше номер поколения, тем луч-

самообучаться. К примеру, вражеский солдат,

на теории генов, Чарльз Дарвин вывел свою зна-

ше особи. И еще мысль: если продолжать «проф-

получив несколько пулевых ранений во время от-

менитую теорию эволюции (что-то подсказывает

отбор» и во время игры, то получится, что каждый

чаянной попытки лобовой атаки, запомнит, что от

мне, что Дарвин вообще ничего не знал о генах:

следующий противник будет более приспособлен

пуль больно и еще раз «так» лучше не делать.

когда Чарльз писал свои книги, Мендель еще не

к конкретному игроку. Возникает некое подобие

Или он сможет по чуть-чуть перенимать тактику

опубликовал даже свои опыты :) — прим. Лозов-

самообучения системы ИИ.

ведения боя у игрока. Вот это действительно за-

ского). Суть теории Дарвина известна всем: выжи-

кто к нам в сети попадет Нейронные

хватывающе!

вает сильнейший, то есть самый приспособлен-

«теперь и ты знаешь кунг-фу» Âîò, â

ный. У одних видов показателем «силы» может

сети являются, пожалуй, одной из самых продви-

быть скорость, у других — устойчивость к моро-

нутых и перспективных технологий создания ИИ.

общем, и все. Мы рассмотрели несколько самых

зам, у третьих — собственно физическая сила. На

Применять нейронные сети в играх начали сравни-

мощных технологий создания ИИ в играх, и тебе

основе этих базовых концепций и создают ИИ

тельно недавно из-за их сложности и высокой тре-

остается только посмотреть на наш диск, где мы

в некоторых играх. Для начала зададим структуру

бовательности к вычислительным ресурсам. Суть

заготовили несколько приятных программерских

ДНК как массив генов и их возможных значений.

заключается в попытке математического модели-

бонусов. Ну и, конечно же, дам парочку полезных

Не забудем учесть, что здесь понятие гена может

рования работы головного мозга человека, кото-

советов напоследок :).

 

 

быть намного шире и с его помощью удобно коди-

рый состоит из множества нейронов, соединенных

Прежде всего стоит помнить, что разработ-

 

 

 

 

 

 

 

ка плохого ИИ часто начинается с ошибочной по-

Набор генов уличного бойца

 

 

 

становки целей. Подумай над тем, какие цели по-

 

 

 

ставлены перед системой, для чего конкретно

 

ã å í î ò è ï

 

â î ç ì î æ í û å ç í à ÷ å í è ÿ

 

она создана, а главное — каких результатов ты

 

Прическа

 

лысый, короткая стрижка, панк, косичка

 

ждешь от нее. Например, было бы глупо и страш-

 

Одежда

 

шорты, белая майка и синие джинсы, кимоно, спортивный костюм

 

но расточительно биться в муках несколько дней,

 

Техника

 

бокс, кикбоксинг, каратэ, кикбоксинг, самбо, тайский бокс

прикручивая супертехнологичный ИИ к тупому

 

Скорость

 

5–10

 

 

 

зомби в новом клоне Crimsonland: ему потребует-

 

Ñèëà

 

1–10

 

 

 

ся только знать, где находится игрок, и двигаться

 

Ñïåö. óäàð

нет, вертушка, аперкот снизу

 

 

в этом направлении :)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

w

 

 

to

42 |

ТЕОРИЯ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

m

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

lua!рецепты

СОВЕТЫ ПО ПРОГРАММИРОВАНИЮ ИГР

LUA (www.lua.org) — ОДИН ИЗ СКРИПТОВЫХ ЯЗЫКОВ, ИСПОЛЬЗУЕМЫХ В ИГРАХ ЧАЩЕ ВСЕГО. ЭТОТ ЯЗЫК ПОПУЛЯРЕН НАСТОЛЬКО В ОСНОВНОМ БЛАГОДАРЯ ПРОДУМАННОМУ ДИЗАЙНУ

И РЕАЛИЗАЦИИ ЯЗЫКА |АЛЕКСАНДР ГЛАДЫШ (WWW.STEPGAMES.RU)

«ВСЕ О БЕТА-ТЕСТИРОВАНИИ LUA 5.1 — НА WWW.INF.PUC-RIO.BR/ ~ROBERTO/TALKS/NOVELTIES.PDF»

Первая версия языка Lua была создана в 1993 году сотрудниками научно-исследовательской группы по технологиям компьютерной графики (Computer Graphics Technology Group, TeCGraf) Бразильского папского католического университета (Pontifical Catholic University, PUC-Rio) в Рио- де-Жанейро. Над языком работали три человека: Роберто Иерусалимский (Roberto Ierusalimschy), Луиш Энрике де Фигуиредо (Luiz Henrique de Figueiredo) и Вальдемар Челеш (Waldemar Celes). Название языка на португальском означает «луна» и произносится как «луа» (LOO-ah). Истории развития языка посвящена специальная страница

его официального сайта — www.lua.org/versions.html.

В 2003 году выпущена версия языка 5.0.2, последняя на момент написания статьи (следующая версия 5.1 находится на стадии бета-тестирования) — Lua обрел зрелость и стабильность. Его интерпретатор, реализованный на основе регистровой (registerbased) виртуальной машины, очень эффективен и по производительности, и по объему занимаемой памяти. В сборке со всеми стандартными библиотеками языка он добавляет к исполняемому файлу программы всего порядка 150 Кб (100 Кб без библиотек).

Интерпретатор Lua написан на «чистом» (clean) C (подмножестве языков ANSI C и C++), его можно собрать на любой платформе, для которой существует компилятор, поддерживающий стандарт ANSI C. Высокая портируемость (portability) языка обеспечена!

Изначально Lua был задуман как язык расширения функциональности приложений (extension language), и поэтому он обладает достаточно удобным в этом плане интерфейсом (так называемый Lua C API).

гибкий синтаксис Lua обладает несложным синтаксисом, близким к традиционному и несколько напоминающим Pascal. Часто элементы синтаксиса носят необязательный характер, что позволя-

cборка версии 5.0.2

LUA C API ВЕРСИИ 5.0.2 ПО УМОЛЧАНИЮ СОСТОИТ ИЗ ДВУХ СТАТИЧЕСКИХ БИБЛИОТЕК: ЯДРА И НАБОРА СТАНДАРТНЫХ БИБЛИОТЕК ЯЗЫКА (В ВЕРСИИ 5.1 ЭТИ БИБЛИОТЕКИ УЖЕ ОБЪЕДИНЕНЫ В ОДНУ). ДИСТРИБУТИВ LUA НАХОДИТСЯ НА ОФИЦИАЛЬНОМ САЙТЕ ЯЗЫКА (www.lua.org). МОЖЕШЬ СКАЧАТЬ ПРЕКОМПИЛИРОВАННУЮ ВЕРСИЮ LUA С САЙТА LUAFORGE (luabinaries.luaforge.net).

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

to BUY

 

 

 

 

 

 

 

 

 

 

 

w| 43

 

 

 

 

m

w Click

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ет писать на Lua и в C-подобном стиле, и в стиле, который при определенном старании можно приблизить к некоему подобию формализованного че- ловеческого языка благодаря отсутствию избыточ- ных синтаксических конструкций. Традиционный пример Hello world на Lua состоит из одной строчки:

print(“Hello, world!”);

Синтаксис языка позволяет при желании опустить скобки и точку с запятой. Таким образом, вот эта конструкция эквивалентна первой:

print “Hello, world”

Обычно сердцу программиста милее конструкция со скобками: ее легче воспринимает взгляд, натренированный работой с C-подобными языками. Однако язык Lua удобно использовать в качестве языка, специализированного под конкретную задачу (Domain-Specific Languages, DSL), например как язык описательного характера, такой как «язык» конфигурационного файла программы. Свобода в синтаксисе Lua бывает очень полезна для повышения выразительности подобных языков.

В Lua также удобно хранить табличные данные, причем их можно экспортировать непосредственно из Excel, написав маленький скрипт-кодоге- нератор на Visual Basic. Значит, больше не нужен лишний парсер данных (например, в формате CSV), парсер и интерпретатор Lua сделают все за тебя.

на полную мощность Часто при разработке архитектуры скриптовой системы и при непосредственной разработке на Lua программисты допускают ошибку — пытаются писать на этом языке так, как будто он некое бледное подобие C++. Lua — мультипарадигменный язык, гибкий в той степени, чтобы допускать разработку в стиле C++. Однако удобнее и эффективнее рассматривать его как самостоятельную сущность и вести разработку исходя из всего богатства возможностей, в том числе работать с возможностями, которых или нет в C++, или использование которых затруднительно.

Функции в Lua — значения первого класса. В Lua есть замыкания (closures). Функция может возвращать список значений... Если ты помнишь обо всем этом, то значительно облегчишь свой труд по разработке проекта. Подход с использованием корутин (coroutines) дает хорошее преимущество в объеме и прозрачности кода (если сравнивать с классическими системами взаимодействия с движком, основанными исключительно на обратных вызовах (callbacks) и/или событиях (events). Благодаря встроенным в язык возможностям рефлексии (например, функции type и функциям работы с таблицами), на Lua очень удобно реализуются связанные с ней задачи, скажем сериализация (пример такой реализации есть в книге Programming In Lua). Когда в движке требуются рефлективные возможности (для сериализации

или автоматической генерации интерфейса редактирования данных), не пытайся прикрутить рефлексию к C++, а используй возможности Lua.

консоль игры В поставку Lua, помимо исходников библиотеки для программной работы с интерпретатором (Lua C API), входят исходники интерактивного интерпретатора (lua.exe), очень удобного для изучения языка, быстрого тестирования и отладки небольших кусков кода. Пользуясь им, ты видишь результат выполнения написанного кода не отходя от кассы. Очень удобно реализовать функциональность, аналогичную той, которой обладает интерактивный интерпретатор Lua, в консоли игры. Тогда ты и твои дизайнеры смогут эффективно писать код в контексте твоего движка и немедленно просматривать то, как изменения в коде влияют на игровой мир.

перенаправление вывода Посмотрим

такой пример. В Lua нужно переопределить функцию print, чтобы она выводила текст не в стандартный поток вывода, а в игровую консоль. Функция print в Lua является частью базовой библиотеки языка и принимает список аргументов переменной длины. Она преобразует каждый из аргументов

âстроку при помощи функции tostring() и выводит ее разделяя символами табуляции.

Функции в Lua — значения первого класса (first-class values), их можно присваивать переменным, передавать в качестве аргументов и возвращать из других функций. Благодаря этому переопределение любой функции в Lua — не больше чем присвоение переменной с именем этой функции нового значения. Если у тебя есть функция __console_print, которая принимает строку и выводит ее

âконсоль, то переопределение системной функции print в Lua будет выглядеть, например, вот так:

print = function(...) for i = 0, arg.n -1 do

__console_print(tostring(arg[i]) .. "\t") end

__console_print(arg[arg.n] .. "\n") end

Если нужна высокая гибкость или производительность, ты можешь написать свою функцию __console_print на C/С++, которая работает непосредственно с виртуальным стеком интерпретатора, по образцу print из базовой библиотеки функций (luaB_print() в файле lbaselib.c исходников Lua). Фактически ты только продублируешь ее исходный код, заменив в нем вызов fputs() на вызов нужной функции. Соответственно, для замены стандартного print в Lua достаточно одной строчки:

print = __console_print

При необходимости аналогичным образом переопределяешь и другие стандартные функции, работающие с вводом-выводом.

дополнительные

источники

информации

WWW.LUA.ORG — ОФИЦИАЛЬНЫЙ САЙТ ЯЗЫКА LUA. ДИСТРИБУТИВ, ОФИЦИАЛЬНОЕ РУКОВОДСТВО LUA 5.0 REFERENCE MANUAL, А ТАКЖЕ КНИГА РОБЕРТО ИЕРУСАЛИМСКОГО PROGRAMMING IN LUA, В КОТОРОЙ ИЗЛОЖЕНЫ ОСНОВНЫЕ ПРИЕМЫ РАБОТЫ С ЯЗЫКОМ.

WWW.LUA-USERS.ORG — САЙТ СООБЩЕСТВА ПОЛЬЗОВАТЕЛЕЙ LUA. СОДЕРЖИТ LUA USERS WIKI, В КОТОРОЙ МОЖНО НАЙТИ МАССУ ПОЛЕЗНЫХ СТАТЕЙ, НАПИСАННЫХ КАК РАЗРАБОТЧИКАМИ ЯЗЫКА, ТАК И ПРОСТЫМИ ПОЛЬЗОВАТЕЛЯМИ. WWW.LUAFORGE.NET — СОБРАНИЕ ПРОГРАММ, НАПИСАННЫХ НА LUA, ИСПОЛЬЗУЮЩИХ LUA ИЛИ СВЯЗАННЫХ С НИМ. WWW.INF.PUC-RIO.BR/~ROBERTO — ОФИЦИАЛЬНАЯ WEB-СТРАНИЦА ОДНОГО ИЗ АВТОРОВ ЯЗЫКА РОБЕРТО ИЕРУСАЛИМСКОГО. СОДЕРЖИТ, В ЧАСТНОСТИ, ТЕКСТЫ ЕГО ДОКЛАДОВ ПО ЯЗЫКУ. WWW.KEPLERPROJECT.ORG — ПРОЕКТ АВТОРОВ ЯЗЫКА ПО СОЗДАНИЮ ДВИЖКА ДЛЯ РАЗРАБОТКИ WEB-САЙТОВ НА LUA. МОЖНО РАЗДОБЫТЬ ПОЛЕЗНЫЕ МОДУЛИ, ТАКИЕ КАК LUASOCKET, LUAPROFILER

È LUALOGGING.

подключение игры к движку Вместе

с языком для подключения языка к твоей программе поставляется библиотека на C (Lua C API). Для взаимодействия с языком C интерпретатор Lua использует виртуальный стек. Когда из скрипта вызывается функция на C, она получает чистый экземпляр стека, который независим от стеков других функций, вызванных на данный момент, и содержит аргументы, переданные в данную функцию. Значения, возвращаемые функцией, тоже передаются через стек. Большинство функций Lua C API работают и с виртуальным стеком. Для удобства эти функции не следуют строгой стековой дисциплине, когда можно использовать только операции push и pop, но позволяют обращаться к значениям, содержащимся в стеке, по их абсолютной или относительной позиции. Подробности о работе с виртуальным стеком интерпретатора Lua расписаны в Lua Reference Manual.

Чаще всего удобнее оказывается работа на более высоком уровне, который предоставляют различные библиотеки-обертки. Тем не менее полезно уметь работать с интерпретатором непосредственно на уровне Lua C API, хотя бы чтобы понять, что происходит на самом деле. К тому же для некоторых специфических задач бывает просто недостаточно функциональности, предоставляемой библиотеками-обертками.

Язык Lua специально создавался как язык расширения функциональности (extension programming language), поэтому достаточно легко ор-

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

w

 

 

to

44 |

ТЕОРИЯ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

m

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

ганизовать взаимодействие кода на Lua с кодом на C (и, следовательно, C++).

Помимо Lua C API, существует некоторое количество оберток для этой библиотеки, призванных повысить удобство работы с Lua из C и C++. Такие обертки делятся на две основные группы: 1) генерируют прослойку межъязыкового взаимодействия автоматически на основе данных, подготовленных специальным образом; 2) служат для облегчения ручного создания такой прослойки.

Несмотря на обилие оберток для подключения Lua, стоит изучить Lua C API — получишь самое полное представление о том, что происходит в программе. К тому же при всей своей мощи сам API достаточно небольшой. Необходимую информацию ищи в Lua Programming Manual и Programming With Lua.

На сегодня из библиотек для обеспечения межъязыкового взаимодействия C++ с Lua наиболее развиты:

TOLUA, TOLUA++ (www.tecgraf.puc-

rio.br/~celes/tolua, www.codenix.com/~tolua);

SWIG (www.swig.org);

LUABIND (luabind.sourceforge.net).

ÈtoLua, и SWIG генерируют код регистрации по специально подготовленным входным файлам (SWIG умеет генерировать такой код не только для Lua, но и для множества скриптовых языков).

Luabind использует шаблоны C++ для генерации кода регистрации твоих типов в Lua, поэтому он избавляет от промежуточного этапа генерации кода сторонними средствами за счет некоторого оверхеда в скорости компиляции и объемах конечного исполняемого файла. По моему опыту, удобнее всего пользоваться библиотекой Luabind в сочетании с прямым использованием Lua C API (чтобы реализовать отдельные тонкие моменты).

вопросы производительности Ïðè

разработке программ на Lua нужно иметь в виду, что компилятор этого языка не обладает широкими способностями по оптимизации. С другой стороны, интерпретатор Lua реализован очень эффективно и чаще всего обеспечивает весьма приличную скорость работы. Если же тебе нужна сверхвысокая производительность, ты должен сам следить за тем, чтобы в коде не было множества лишних конструкций. Добиться этого будет легче, если будешь придерживаться нескольких простых правил при написании кода на Lua (подробнее о подходах к оптимизации кода на Lua — в материалах, опубликованных в Lua Users Wiki).

Доступ к локальным переменным в Lua несколько быстрее, чем к глобальным. Если требуется интенсивный доступ к глобальной таблице, функции или корутине, лучше завести локальную, присвоить ей значение глобальной и только потом начинать использовать. Эта техника не несет накладных расходов на копирование, так как

в Lua данные таких типов копируются как ссылки, а не как значения.

По возможности в коде, критичном по производительности, не создавай множество объектов Lua, управляемых сборщиком мусора. Такие объекты создаются при склеивании строк, вызове конструкторов таблиц (например при вызовах функций с переменным числом аргументов), при объявлении любых функций, при выполнении команд dofile/dostring.

Компилятор Lua способен выполнять элементарную оптимизацию. Например, он оптимизирует простые выражения с участием переменных и констант. Не обязательно заменять, скажем, выражение:

a = 2 * 34567 + b

íà

a = 69134 + b.

Перевод скриптового кода в код на C++ — один из действенных методов оптимизации. Если тебе вдруг показалось, что какой-то участок кода на Lua нужно подвергнуть интенсивной оптимизации, может быть, ты обнаружил первый сигнал к тому, что этот кусок кода нужно переписать на C++.

Заботясь о производительности кода, остерегайся преждевременной оптимизации. По возможности соблюдай рекомендации по написанию оптимального по производительности кода — писать гарантированно медленный код не стоит. Однако, как известно, затраты, скажем, на оптимизацию куска кода, который выполняется не более 1% времени, не уменьшат временные затраты на выполнение программы больше чем на 1%.

Сначала реализуй код самым удобным (по твоим ощущениям) способом. Если понадобится, собирай статистику с помощью таких инструмен-

òîâ, êàê Lua Profiler (www.keplerproject.org/luaprofiler).

И оптимизируй только то, что действительно должно быть оптимизировано.

обработка ошибок Важно помнить, что при небрежном отношении к обработке ошибок в Lua, после возврата ошибки из lua_pcall(), скриптовая система может оказаться в невалидном состоянии.

Безопаснее всего (по крайней мере, в стадии активной разработки) прекращать выполнение программы при возникновении ошибок

âскрипте. Естественно, это не относится к консольному интерпретатору, в котором для комфортной работы нужно обеспечивать толерантность к возможным ошибкам и опечаткам. Тем не менее желательно принимать меры к тому, чтобы ошибки

âкоде, выполняемом с консоли, не приводили к неявной «порче» игрового мира.

чтобы ошибок было меньше, вот несколько простых правил на заметку:

ПРИ ВОЗНИКНОВЕНИИ ОШИБКИ

В ФУНКЦИЯХ НА LUA ВМЕСТО ВЫЗОВА

БИБЛИОТЕЧНОЙ ФУНКЦИИ ERROR() ВОЗВРАЩАЙ NIL И ТЕКСТ СООБЩЕНИЯ ОБ ОШИБКЕ.

ФУНКЦИИ, КОТОРЫЕ МОГУТ ВЫЗВАТЬ ERROR(), ВЫЗЫВАЙ (ГДЕ ВОЗМОЖНО) ЧЕ- РЕЗ БИБЛИОТЕЧНУЮ ФУНКЦИЮ PCALL(), ДЛЯ ЧЕГО ЛУЧШЕ ИСПОЛЬЗОВАТЬ ИДИОМУ PROTECT, ОПИСАННУЮ В СТАТЬЕ ДИЕГО НЕХАБА (DIEGO NEHAB) FINALIZED

EXCEPTIONS (www.lua-users.org/wiki/FinalizedEx- ceptions). ТАКЖЕ ПОЛЕЗНО ПОЛЬЗОВАТЬСЯ ИДИОМОЙ NEWTRY (СМ. ТУ ЖЕ СТАТЬЮ).

ПРОВЕРЯЙ ПЕРЕДАННЫЕ ФУНКЦИИ ПАРАМЕТРЫ НА NIL. ЕСЛИ, НАПРИМЕР, ФУНКЦИЯ, ОБЪЯВЛЕННАЯ С ТРЕМЯ ПАРАМЕТРАМИ, ВЫЗЫВАЕТСЯ С ДВУМЯ, ТО ТРЕТЬЕМУ ПАРАМЕТРУ БУДЕТ ПРИСВОЕН NIL.

ЕСЛИ ТВОЯ ФУНКЦИЯ РАБОТАЕТ С ГЛОБАЛЬНЫМИ ДАННЫМИ, ОСОБЕННО С ОПИСАНИЯМИ УРОВНЕЙ, ТЕКСТАМИ

ДИАЛОГОВ И Т.П., ПО ВОЗМОЖНОСТИ ПРОВЕРЯЙ ЭТИ ДАННЫЕ НА NIL.

ОЧЕНЬ ЧАСТО ОШИБКИ ВОЗНИКАЮТ ИЗЗА ТОГО, ЧТО ПРОГРАММИСТ ЗАБЫЛ НАПИСАТЬ КЛЮЧЕВОЕ СЛОВО LOCAL ПЕРЕД ПЕРВЫМ ПРИСВАИВАНИЕМ ЛОКАЛЬНОЙ ПЕРЕМЕННОЙ И ЗАТЕР ТАКИМ ОБРАЗОМ ГЛОБАЛЬНУЮ. СЛЕДИ ЗА ОБЛАСТЬЮ ВИДИМОСТИ ТВОИХ ПЕРЕМЕННЫХ. В НАЗВАНИЯХ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ ИСПОЛЬЗУЙ УНИКАЛЬНЫЙ ПРЕФИКС, НАПРИМЕР G_. ПРИМЕНЯЙ ИНСТРУМЕНТЫ ТИПА LUA LINT ДЛЯ ПРОВЕРКИ ИСПОЛЬЗОВАНИЯ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ. В ДИСТРИБУТИВ LUA 5.1 ВХОДИТ ПРИМЕР НА LUA, КОТОРЫЙ НАСТРАИВАЕТ МЕТАТАБЛИЦУ ТАБЛИЦЫ, СОДЕРЖАЩЕЙ ГЛОБАЛЬНЫЕ ПЕРЕМЕННЫЕ (“_G”), ТАКИМ ОБРАЗОМ, ЧТО ПРИ ДОБАВЛЕНИИ ИЛИ ЧТЕНИИ НЕЗАРЕГИСТРИРОВАННЫХ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ ВО ВРЕМЯ ВЫПОЛНЕНИЯ СКРИПТА ВЫДАЕТСЯ СООБЩЕНИЕ ОБ ОШИБКЕ.

СТАРАЙСЯ МИНИМИЗИРОВАТЬ ИСПОЛЬЗОВАНИЕ ГЛОБАЛЬНЫХ ПЕРЕМЕННЫХ. СОБЛЮДАЙ МОДУЛЬНОСТЬ КОДА. СЧИТАЕТСЯ ХОРОШИМ ТОНОМ, ЕСЛИ ОДИН МОДУЛЬ СОЗДАЕТ ТОЛЬКО ОДНУ ГЛОБАЛЬНУЮ ПЕРЕМЕННУЮ. ПОДРОБНЕЕ О ПОДХОДАХ

К ОРГАНИЗАЦИИ МОДУЛЕЙ В LUA МОЖНО ПРОЧИТАТЬ В LUA TECHNICAL NOTE 7: MODULES & PACKAGES РОБЕРТО ИЕРУСАЛИМСКОГО (www.lua.org/notes/ltn007.html).

ИЗБЕГАЙ СОЗДАВАТЬ НА СКРИПТОВОМ ЯЗЫКЕ СЛИШКОМ СЛОЖНЫЕ СИСТЕМЫ. ДИНАМИЧЕСКАЯ ТИПИЗАЦИЯ И ПРОЧИЕ ОСОБЕННОСТИ, ПРИ ВСЕМ СВОЕМ

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

to BUY

 

 

 

 

 

 

 

 

 

 

 

w| 45

 

 

 

 

m

w Click

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

УДОБСТВЕ, ПЛОХО ВЛИЯЮТ НА СТАБИЛЬНОСТЬ, НАДЕЖНОСТЬ И ПРОИЗВОДИТЕЛЬНОСТЬ КОДА. СКРИПТОВЫЕ ЯЗЫКИ ВООБЩЕ И LUA В ЧАСТНОСТИ ХОРОШИ ДЛЯ «СКЛЕЙКИ» И НАСТРОЙКИ ФУНКЦИОНАЛЬНОСТИ ИГРОВОГО ДВИЖКА. ЕСЛИ ТЫ ВИДИШЬ, ЧТО КАКОЙ-ТО МОДУЛЬ НА LUA СТАНОВИТСЯ СЛИШКОМ СЛОЖНЫМ, ПОСТАРАЙСЯ ПЕРЕНЕСТИ ЕГО ФУНКЦИОНАЛЬНОСТЬ НА C++, ОСТАВИВ LUA ТОЛЬКО ВЫСОКОУРОВНЕВОЕ УПРАВЛЕНИЕ ЭТИМ МОДУЛЕМ.

управление памятью Язык Lua автомати-

чески управляет памятью при помощи сборщика мусора (garbage collector): интерпретатор периоди- чески вызывает сборщик мусора, удаляющий объекты, для которых была выделена память (таблицы, userdata, функции, потоки и строки) и которые стали недоступными из Lua («мертвые» объекты).

Интерпретатор Lua задает предел объема памяти (threshold), занимаемого данными. Как только занятый объем достигнет этого предела, запускается алгоритм, освобождающий память, занятую накопившимися «мертвыми» объектами. Затем ус-

танавливается новый предел, равный двухкратному объему памяти, занимаемой после очистки.

Чтобы запустить сборку мусора немедленно, нужно программно установить предел занимаемой памяти в 0 (вызвав lua_setgcthreshold() из C или collectgar-bage() из Lua). Чтобы остановить сборку мусора, устанавливаем этот предел в достаточно большое значение.

Замечено, что в некоторых случаях память, занимаемая данными Lua, проявляет тенденцию к разрастанию, что может негативно сказаться на производительности программы. Чтобы избежать этого, лучше периодически вызывать сборку мусора принудительно.

При написании программ на Lua обязательно учитывай то, каким образом интерпретатор Lua управляет распределением памяти. Сборка мусора

âверсии 5.0.2 — относительно затратная по производительности операция (используется алгоритм non-incremental mark and sweep). Она инициируется автоматически, когда объем выделенной памяти превышает двукратный объем памяти, оставшейся выделенной после предыдущей сборки мусора (объем выделенной памяти, при превышении которого произойдет следующая сборка мусора, также можно задавать программно). Значит, фактически,

âдостаточно большой динамической системе

сборка мусора может быть запущена в произвольный момент времени, вызвав просадку по производительности. Чем больше памяти выделено под объекты Lua, тем дольше происходит сбор мусора.

Итак, если ты, например, читаешь в Lua данные из файла построчно и склеиваешь их в одну строку линейно, скорее всего, процесс будет продвигаться страшно медленно: после каждой следующей операции склейки объем занятой памяти, как минимум, удваивается и, соответственно, запускается процесс сборки мусора.

Код создает новую строку (и присваивает ее переменной some_string), а строка, хранившаяся в some_string до склейки, остается в памяти до следующей сборки мусора:

some_string = some_string .. "a"

Такая проблема и способы ее решения описаны в статье Роберто Иерусалимского Lua Technical Note 9: Creating Strings Piece by Piece (www.lua.org/notes/ltn009.html). В Lua 5.1 реализована инкрементальная сборка мусора, позволяющая распределить нагрузку по производительности от процесса сборки мусора во времени

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

w

 

 

to

46 |

ТЕОРИЯ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

m

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Многообразие «железа» под IBM PC доставляет множество неприятностей и буквально сводит разработчиков с ума, но это ничто по сравнению с миром мобильных устройств. Меняется не только архитектура процессора, объем памяти, глубина цветности, но даже геометрия дисплея и расположение кнопок, что ужесточает требования к дизайну — чертовски трудно создать игру, которая сохраняла бы свою привлекательность на устройствах всего спектра. Никакой стандартизацией здесь и не пахнет.

Карманные компьютеры, позиция которых еще вчера казалась несокрушимой, сегодня сходят со сцены, уступая места «смартфонам» — сотовым телефонам с функциями КПК. Мощность процессоров и объемы памяти растут

проблемы

переносимости

НА МОБИЛЬНЫЕ УСТРОЙСТВА

РЫНОК МОБИЛЬНЫХ ИГР РАСТЕТ ВЗРЫВООБРАЗНО, А ВМЕСТЕ С НИМ РАСТЕТ И ИНТЕРЕС ПРОГРАММИСТОВ. ЛАКОМЫЙ КУСОК РЫНКА! ПРАКТИЧЕСКИ ВСЯКИЙ, КТО ХОТЯ БЫ ОДИН РАЗ СОЗДАВАЛ ИГРУ ДЛЯ ПК, НАЧИНАЕТ ПОГЛЯДЫВАТЬ В СТОРОНУ СОТОВЫХ ТЕЛЕФОНОВ. РАЗРАБОТКА ИГР ДЛЯ МОБИЛЬНЫХ

УСТРОЙСТВ — ЗАНЯТИЕ ДЕЙСТВИТЕЛЬНО НЕСЛОЖНОЕ,

НО В НЕМ ЕСТЬ НЮАНСЫ |Ê Ð È Ñ Ê À Ñ Ï Å Ð Ñ Ê È À Ê À Ì Û Ù Ú Õ

не по дням, а по часам. Цветной дисплей и графический акселератор — уже не редкость, а насущность и необходимость. Прошли времена, когда пользователь был доволен тем, что установил на сотовый телефон «Пасьянс» или «Дурак», и теперь народ требует трехмерных игр с активной динамикой.

Основная проблема в том, что жизненный цикл мобильных устройств очень невелик, а их популяция крайне разнообразна. Так что разработка игры для одной конкретно взятой модели, скорее всего, не окупится и придется заняться ее портированием на другие платформы. Так что ставим себе задачу провернуть достаточно хитрую и коварную операцию, причем планируем ее заранее.

ПЛАТФОРМЫ ДЛЯ РАЗРАБОТЧИКОВ

j2me

Подавляющее большинство мобильных

 

приложений (по некоторым оценкам, аж

 

до 70%) пишутся на Java (а точнее J2ME,

 

расшифровывается как Java 2 Micro Edi-

 

tion) — урезанной версии языка, ориенти-

 

рованной на маломощные системы и под-

 

держивающей рекордное количество мо-

 

бильных устройств. Вместо «живого» ма-

 

шинного кода сотовому телефону подсо-

 

вывают так называемый «байт-код», кото-

 

рый исполняется на виртуальной машине

 

(Virtual Machine, сокращенно VM). Разра-

 

боткой VM занимается компания Sun (соз-

 

датель языка Java) и сторонние постав-

 

щики, так как спецификации байт-кода от-

 

крыты, а SDK (пакет программ и библио-

 

тек для разработчиков) бесплатен.

 

Теоретически, игра, написанная

 

для одного сотового телефона, пойдет

 

на любом устройстве, для которого есть

 

соответствующая реализация VM. Даже

 

на пылесосе и домофоне! На практике

Популярная среда

же выходит иначе. Прежде всего, произ-

разработки Eclipse

водительность J2ME-приложений край-

ïîä J2ME

не невелика, и вычислительной мощно-

 

сти даже самых быстрых телефонов мо-

жет попросту не хватить для разработки динамичной игры. Чтобы преодолеть это ограничение, производители телефонов выпускают специальные высокопроизводительные библиотеки (попутно реализующие дополнительные возможности по работе с дисплеем и музыкой), несовместимые, однако, со стандартной виртуальной машиной, и поэтому непе-

реносимые. Естественно, Sun не стоит на месте и продолжает наращивать потенциал мобильной Java. Достаточно сказать, что в MIDP 1.0 не было поддержки работы со спрайтами, и вплоть до появления MIDP 2.0 разработчикам приходилось делать это самим. Однако время уже упущено — на мобильную сцену ринулись конкуренты.

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

E

 

 

 

 

X

 

 

 

 

 

-

 

 

 

 

d

 

 

F

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

r

P

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

to BUY

 

 

 

 

 

 

 

 

 

 

 

w| 47

 

 

 

 

m

w Click

 

 

 

 

o

 

w

 

 

 

 

 

 

 

 

.

 

 

 

 

.c

 

 

 

p

 

 

 

g

 

 

 

 

 

df

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

brew

Двоичная среда исполнения для беспроводных устройств (Binary Runtime Environment for Wireless, сокращенно BREW) — альтернативная программная платформа, разработанная Qualcomm. В наших мозгах эта компания упорно ассоциируется с аббревиатурой CDMA, где, собственно, и зародился BREW, а на GSM-телефоны он был перенесен значительно позднее. Как понятно по названию, это двоичная среда! В состав бесплатно распространяемого SDK входит полноценный С/С++-

компилятор ARM Builder, который генерирует высокопроизводительный код (несомненный плюс).

Какое-то время назад все были убеждены, что Qualcomm завоюет мир. Темпы, которыми развертывалось BREW, вселяли оптимизм. Смущало лишь то, что данная технология поддерживает лишь семь моделей телефонов, в то же время Qualcomm требует обязательной сертификации всех приложений. С одной стороны, так гарантировалось высокое каче-

ство кода, с другой — разработчики высаживались на геморрой, поэтому позднее развитие BREW зашло в тупик.

execution

 

Execution Engine — разработка компании

 

engine

 

In-Fusio, еще один конкурент на голову

 

 

 

Sun, которая попыталась обойти ограни-

 

 

 

чения, накладываемые J2ME. Здесь пред-

 

 

 

ставлен не двоичный код (как в BREW),

 

 

 

а виртуальная машина (как в Java), толь-

 

 

 

ко более производительная. В среднем

 

 

 

быстродействие выше в 10-15 раз, а на

Реалистичная трех-

 

 

некоторых операциях — в 30 раз! Кроме

мерная игра, разра-

 

 

того, Execution Engine поддерживает ряд

ботанная с помощью

 

 

жизненно важных графических функций

Execution Engine

 

 

(масштабирование, панорамная прокрут-

 

 

 

ка, трассировка лучей, вращения), кото-

рые J2ME-программисты вынуждены реализовывать самостоятельно на медленном байт-коде. Execution Engine делает это непосредственно из машинно-зави- симых библиотек, специальным образом оптимизированных под каждую поддерживаемую модель телефона. Вот только поддерживается совсем немного моделей: Philips Fisio 530/825, Alcatel OT 735/535/531, Panasonic X70/G60, Sagem myX- 5/myG-5/myX-6... Добавлю и то, что SDK далеко не бесплатен и это отталкивает многих разработчиков.

mophun Весьма перспективная платформа. Разработана wge компанией Synergenix и позиционируется как «карманная консоль на базе ПО». Производитель-

ность — выше всяких похвал. Там, где J2ME показывает 400 KIPS, Mophun выдает 60 MIPS, что в 150 раз быстрее. Хорошо, конечно, но ассортимент поддерживаемых устройств, как легко догадаться, невелик. Плюс Synergenix требует обязательной сертификации всех приложений.

Wireless Graphics Engine (сокращенно WGE) от компании TTPCom содержит удобный API, ориентированный на создание двух- и трехмерных игр. Программировать на нем — одно удовольствие, к тому же SDK распространяется на бесплатной основе. Единственным недостатком остается ограниченный круг поддерживаемых телефонов.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Игра, разработанная

 

«ACE» — игрушка,

 

 

 

с применением

 

реализованная

 

 

 

платформы Wireless

 

íà Mophun

 

 

 

Graphics Engine

 

 

 

 

 

 

 

 

 

 

 

 

 

Вывод: J2ME — единственная платформа, которая обеспечивает хоть какую-то переносимость. Для разработчиков неторопливых логических игр — оптимальный вариант, но динамическая графика по производительности уже не тянет. Альтернативные платформы решают проблему производительности нанося ущерб совместимости и налагая на разработчиков множество различных ограничений (типа лицензирования), что только отталкивает.

Если переносимости нет, зачем держаться за враждебные платформы, когда весь необходимый функционал можно реализовать самостоятельно? На ассемблере. Получишь высокую скорость и лучшую поддержку конкретного оборудования, соответственно, сможешь создать быструю и динамичную игру с кучей наворотов, которые отсутствуют у конкурентов, использующих J2ME.

Лучшие игры (типа Fight Hard 3D) создаются именно так. Естественно, о переносимости в этом

случае придется забыть. Серьезно потрудившись, ты сможешь перенести свое творение на парутройку популярных телефонов, но не более того. Иначе затея окажется нерентабельной и к моменту завершения переноса возникнут новые технологии, появятся новые идеи, а игра, казавшаяся когда-то вершиной научной мысли, станет никому не нужным барахлом. В этом и состоит главное отличие приложений для сотовых телефонов от, например, картин.

Реалистичная трехмерная игра, разработанная с помощью Execution Engine

 

 

 

 

hang

e

 

 

 

 

 

 

 

 

C

 

 

E

 

 

 

 

 

X

 

 

 

 

 

 

 

 

-

 

 

 

 

 

 

d

 

 

 

F

 

 

 

 

 

 

 

t

 

 

 

D

 

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

 

 

r

 

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

w

 

 

to

48 |

ТЕОРИЯ

w Click

 

 

 

 

 

 

 

 

 

 

 

 

 

 

o

m

 

 

w

 

 

 

 

 

 

 

 

 

 

 

.

 

 

 

 

 

 

.c

 

 

 

 

p

 

 

 

 

 

g

 

 

 

 

 

 

df

 

 

 

n

e

 

 

 

 

 

 

-xcha

 

 

 

 

 

 

 

 

 

hang

e

 

 

 

 

 

 

 

C

 

E

 

 

 

 

X

 

 

 

 

 

 

-

 

 

 

 

 

d

 

 

F

 

 

 

 

 

 

t

 

 

D

 

 

 

 

 

 

 

i

 

 

 

 

 

 

 

 

 

r

P

 

 

 

 

 

NOW!

o

 

 

 

 

 

 

 

 

 

 

 

 

BUY

 

 

 

 

 

 

to

 

 

 

 

 

w Click

 

 

 

 

 

m

 

 

 

 

 

 

w

 

 

 

 

 

 

 

 

 

 

w

 

 

 

 

 

 

 

o

 

 

.

 

 

 

 

 

.c

 

 

 

p

 

 

 

 

g

 

 

 

 

 

df

 

 

n

e

 

 

 

 

 

-x cha

 

 

 

 

Россыпь проблем совместимости:

РАСКЛАДКИ КЛАВИАТУРЫ РАЗЛИЧАЮТСЯ В ЗАВИСИМОСТИ ОТ УСТРОЙСТВА. ИНОГДА УДОБНО, НО ЧАЩЕ ВСЕГО — НЕ ОЧЕНЬ. ЗНАЧИТ, ИГРА НЕ ТОЛЬКО ДОЛЖНА ДОПУСКАТЬ ПЕРЕОПРЕДЕЛЕНИЕ КЛАВИШ, НО И ПРЕДОСТАВЛЯТЬ ТЩАТЕЛЬНО ПРОДУМАННЫЙ ИНТЕРФЕЙС, КОТОРЫЙ ПОЗВОЛИТ УПРАВЛЯТЬ ОДНОЙ РУКОЙ И С МИНИМУМОМ ТЕЛОДВИЖЕНИЙ.

ВСТРЕЧАЮТСЯ САМЫЕ РАЗНЫЕ ГЛУБИНА ЦВЕТНОСТИ И РАЗРЕШЕНИЕ ДИСПЛЕЕВ, И УЛОЖИТЬСЯ В ОДНУ ЦВЕТОВУЮ ПАЛИТРУ ВСЕ РАВНО НЕ ПОЛУЧИТСЯ. НЕ ОСТАЕТСЯ НИЧЕГО ДРУГОГО, КРОМЕ КАК СОЗДАТЬ НЕСКОЛЬКО ВЕРСИЙ ГРАФИЧЕ- СКОГО ОФОРМЛЕНИЯ, КАК ЭТО БЫЛО ВО ВРЕМЕНА CGA-, EGA- И VGA-МОНИТОРОВ.

МОЩНОСТЬ МОБИЛЬНЫХ ПРОЦЕССОРОВ И ОБЪЕМ ДИНАМИЧЕСКОЙ ПАМЯТИ ВАРЬИРУЕТСЯ В ШИРОКИХ ПРЕДЕЛАХ. ЧТОБЫ ПРИ ПОРТИРОВАНИИ НЕ ПЕРЕПИСЫВАТЬ ИГРУ ЗАНОВО, НЕОБХОДИМО ИЗНАЧАЛЬНО ЗАЛОЖИТЬ В НЕЕ МОДУЛЬНУЮ СТРУКТУРУ, ОБЕСПЕЧИВАЮЩУЮ НЕСКОЛЬКО УРОВНЕЙ «РЕАЛИСТИЧНОСТИ». — СООТНОШЕНИЕ МОЩНОСТИ ПРОЦЕССОРА И ОБЪЕМА ПАМЯТИ ТАКЖЕ ПОДВЕРЖЕНО ВАРИАЦИЯМ, ПОЭТОМУ В НЕКОТОРЫХ СЛУЧАЯХ ПРЕДПОЧТИТЕЛЬНЕЕ ТАБЛИЧНЫЕ ВЫЧИСЛЕНИЯ, А В НЕКОТОРЫХ — ОНИ ПРОСТО НЕ ВМЕЩАЮТСЯ.

ЭНЕРГОЕМКОСТЬ АККУМУЛЯТОРОВ ТАКЖЕ РАЗЛИЧНА. ПРИ ПОСТОЯННОЙ ЗАГРУЗКЕ ПРОЦЕССОРА, ДИСПЛЕЯ И ЗВУКА ПОТРЕБЛЕНИЕ ТОКА ВОЗРАСТАЕТ ВЕСЬМА ЗНАЧИТЕЛЬНО. НЕОБХОДИМО ПРОЕКТИРОВАТЬ ИГРУ ТАК, ЧТОБЫ ИГРОВОЙ ЦИКЛ ВМЕЩАЛСЯ ХОТЯ БЫ В ПОЛНОСТЬЮ ЗАРЯЖЕННЫЙ АККУМУЛЯТОР. ЕСЛИ УЧЕСТЬ ТО, ЧТО ТЕЛЕФОН — ЭТО НЕ ТОЛЬКО ИГРУШКА, НО И СРЕДСТВО СВЯЗИ, ЖЕЛАТЕЛЬНО ПРЕДУСМОТРЕТЬ НЕСКОЛЬКО УРОВНЕЙ «ЭНЕРГЕТИЧЕ- СКОЙ ПРОЖОРЛИВОСТИ».

МОБИЛЬНЫЕ УСТРОЙСТВА СОВЕРШЕННО НЕ ПРИСПОСОБЛЕНЫ К ПРОГРАММИРОВАНИЮ, ПОЭТОМУ ОСНОВНОЙ ЦИКЛ

РАЗРАБОТКИ ПРИХОДИТСЯ ВЕСТИ НА ЭМУЛЯТОРЕ, ОДНАКО ПОВЕДЕНИЕ ЭМУЛЯТОРА МОЖЕТ СУЩЕСТВЕННО ОТЛИЧА- ТЬСЯ ОТ ПОВЕДЕНИЯ «ЖИВОГО» СОТОВОГО ТЕЛЕФОНА ИЛИ КПК.

НЕ НА ВСЕ СОТОВЫЕ ТЕЛЕФОНЫ МОЖНО НАЙТИ СПЕЦИФИКАЦИЮ И ЭМУЛЯТОРЫ. ЕСЛИ НЕТ СПЕЦИФИКАЦИИ, О ПРОГРАММИРОВАНИИ НА АССЕМБЛЕРЕ МОЖНО СРАЗУ ЗАБЫТЬ. ПРИХОДИТСЯ ПРОГРАММИРОВАТЬ ПОД J2ME, ОСТАВАЯСЬ В ПОЛНОМ НЕВЕДЕНИИ НАСЧЕТ ДОСТУПНОЙ ПАМЯТИ И ПРОИЗВОДИТЕЛЬНОСТИ.

ТЕСТИРОВАНИЕ ИГР ЗАТРУДНЕНО ТЕМ, ЧТО МОБИЛЬНЫХ УСТРОЙСТВ ОЧЕНЬ МНОГО, ОНИ СТОЯТ ДОРОГО, УСТАРЕВАЮТ БЫСТРО И ПРИОБРЕТАТЬ ВЕСЬ АССОРТИМЕНТ ОБОРУДОВАНИЯ, ИМЕЮЩЕГОСЯ НА РЫНКЕ, МОЖЕТ ПОЗВОЛИТЬ СЕБЕ ТОЛЬКО КРУПНАЯ ФИРМА.

СЛОЖНОСТЬ ПЕРЕНОСА ЧАСТО ПРЕВЫШАЕТ ТРУДОЕМКОСТЬ РАЗРАБОТКИ ПРОГРАММЫ С НУЛЯ. К ТОМУ ЖЕ В ЭТОМ СЛУЧАЕ МЫ МОЖЕМ ЗАДЕЙСТВОВАТЬ СПЕЦИФИЧЕСКИЕ ОСОБЕННОСТИ КОНКРЕТНОЙ МОДЕЛИ ТЕЛЕФОНА.

ОТСУТСТВУЕТ КАКОЙ БЫ ТО НИ БЫЛО СТАНДАРТ НА ЯЗЫК И API МОБИЛЬНЫХ УСТРОЙСТВ. КОМПИЛЯТОРЫ ДВОИЧНОГО И БАЙТ-КОДА ОТ РАЗНЫХ ПРОИЗВОДИТЕЛЕЙ СОВЕРШЕННО НЕСОВМЕСТИМЫ МЕЖДУ СОБОЙ И ОБЕСПЕЧИВАЮТ ПЕРЕНОСИМОСТЬ ТОЛЬКО В РАМКАХ ЗАРАНЕЕ ВЫБРАННОГО МОДЕЛЬНОГО РЯДА, КОТОРЫЙ ПОСТОЯННО ПОПОЛНЯЕТСЯ, НО ДВИЖЕТСЯ В ЗАРАНЕЕ НЕ ПРЕДСКАЗУЕМОМ НАПРАВЛЕНИИ И ОЧЕНЬ ЧАСТО ПАДЕТ ВНИЗ. А ПОСКОЛЬКУ ИСХОДНЫЙ КОД КОМПИЛЯТОРА И ВСЕХ СОПУТСТВУЮЩИХ ЕМУ БИБЛИОТЕК ЯВЛЯЕТСЯ

СОБСТВЕННОСТЬЮ ФИРМЫ-ПРОИЗВОДИ- ТЕЛЯ, РАЗРАБОТЧИКАМ ИГР СОВЕРШЕННО НЕ ГАРАНТИРУЮТ ОТСУТСТВИЕ «ИЗМЕНЫ».

МОБИЛЬНЫЙ МИР ОЧЕНЬ ИЗМЕНЧИВ И НЕПОСТОЯНЕН. ЗА ВРЕМЯ, ПОТРАЧЕННОЕ НА ПЕРЕНОС, КОНКРЕТНАЯ МОДЕЛЬ ТЕЛЕФОНА МОЖЕТ СТАТЬ ПОРЯДОЧНО УСТАРЕВШЕЙ ИЛИ ОКАЗАТЬСЯ ВЫТЕСНЕННОЙ ДРУГОЙ, СОВЕРШЕННО ИНОЙ ПО ХАРАКТЕРИСТИКАМ. И ТОГДА ВЕСЬ ПРОЦЕСС ПРИДЕТСЯ ПРОДЕЛЫВАТЬ ЗАНОВО...

Интерес к мобильным платформам вызван в первую

Сотовый телефон хорош тем, что народ

очередь тем, что сотовый телефон дает программи-

толпами радуется питону, арканоиду или тетри-

стам возможность разработать достойную игру за

су, а от драчки, реализованной в стиле ZX-SPEC-

короткое время (от трех месяцев до года) и со скром-

TRUM, — буквально бьется в экстазе. К сожале-

ными вложениями. На ПК игры выродились в мон-

нию, в отличие от старика спектрума, век мо-

стров, над созданием которых работают огромные

бильных игрушек очень недолог. Зато народ при-

коллективы. Чтобы создать нечто конкурентоспособ-

вык покупать их (через мобильные службы, ко-

ное на ПК усилиями нескольких человек, требуются

нечно), а не пионерить естественным образом

принципиально новые идеи. А у кого они есть?

в ближайшем ларьке. Уровень пиратства на мо-

бильной арене намного ниже, чем на ПК, поэтому заработать деньги на программировании игр вполне реально, даже если мы учтем все сложности переноса на другие платформы.

Очень хочется надеяться, что через несколько лет ситуация нормализуется и появится если не стандарт, то хотя бы какие-то общие черты, объединяющие все мобильные устройства воедино